import axios from 'axios'

// 购物车模块
const cartModule = {
  // 开启子模块的命名空间，作用是：解决（避免）不同模块名字一样，会起冲突的问题
  namespaced: true,
  state(){
    return {
      goodsList: []
    }
  },
  mutations: {
    setGoodsList(state, list){
      state.goodsList = list
    },
    // mutation 和 action 函数 最多接收两个参数，
    // 第一都是固定的，由vuex传入，第二个是自己传入的

    // 设置某个商品的状态
    setGoodsItemState(state, { index, checked }) {
      state.goodsList[index].goods_state = checked
    },
    // 设置所有商品的状态
    setGoodsListState(state, checked){
      state.goodsList.forEach(obj => obj.goods_state = checked)
    }, 
    // 设置某个商品的数量 - 增加
    increase(state, index){
      state.goodsList[index].goods_count++
    },
    // 设置某个商品的数量 - 减少
    decrease(state, index){
      if( state.goodsList[index].goods_count === 1) return
      state.goodsList[index].goods_count--
    },
    // 设置某个商品的数量 - 直接设置
    setGoodsItemCount(state, { index, count }){
      state.goodsList[index].goods_count = count
    }
  },
  actions: {
    asyncSetGoodsList(store){
      // 1. 发ajax请求
      axios({
        url:'https://www.escook.cn/api/cart',
        method: 'GET'
      }).then(resp => {
        // 2. 后端响应的数据 同步到 state 的 goodsList上
        store.commit('setGoodsList', resp.data.list) 
      }).catch(e => {
        console.log(e)
      }) 
    }
  },
  getters: {
    allCount(state){
      return state.goodsList.reduce((sum, obj) => {
         if (obj.goods_state === true) { // 选中商品才累加数量
           sum += obj.goods_count;
         }
         return sum;
       }, 0)
    },
    allPrice(state){
      return state.goodsList.reduce((sum, obj) => {
        if (obj.goods_state){
          sum += obj.goods_count * obj.goods_price
        }
        return sum;
      }, 0)
    },
    isAll(state){
      return state.goodsList.every(obj => obj.goods_state)
    }
  }
}

export default cartModule